package org.handwerkszeug.riak.transport.protobuf.internal; import java.io.IOException; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.ArrayNode; import org.handwerkszeug.riak.RiakException; import org.handwerkszeug.riak.mapreduce.MapReduceResponse; import org.handwerkszeug.riak.nls.Messages; import org.handwerkszeug.riak.transport.protobuf.internal.RawProtoBufRiakclient.RpbMapRedResp; import com.google.protobuf.ByteString; /** * @author taichi */ public class ProtoBufMapReduceResponse implements MapReduceResponse { final RpbMapRedResp resp; public ProtoBufMapReduceResponse(RpbMapRedResp resp) { this.resp = resp; } @Override public Integer getPhase() { if (this.resp.hasPhase()) { return this.resp.getPhase(); } return null; } @Override public ArrayNode getResponse() { if (this.resp.hasResponse()) { ByteString bs = this.resp.getResponse(); JsonFactory factory = new JsonFactory(new ObjectMapper()); try { JsonParser parser = factory.createJsonParser(bs.newInput()); JsonNode jn = parser.readValueAsTree(); if (jn instanceof ArrayNode) { ArrayNode an = (ArrayNode) jn; return an; } else { throw new IllegalStateException(String.format( Messages.MapReduceResponseMustBeArray, jn)); } } catch (IOException e) { throw new RiakException(e); } } return null; } @Override public boolean getDone() { if (this.resp.hasDone()) { return this.resp.getDone(); } return false; } }